package com.dkm.orproject.dkmoa.service.serviceimpl.flow;

import com.dkm.orproject.dkmoa.dao.OaFlowMapper;
import com.dkm.orproject.dkmoa.dao.OaFlowPersonnelMapper;
import com.dkm.orproject.dkmoa.domain.OaFlow;
import com.dkm.orproject.dkmoa.domain.OaFlowPersonnel;
import com.dkm.orproject.dkmoa.service.flow.OaFlowService;
import com.dkm.orproject.utils.utils.IdToobtainUtils;
import com.github.pagehelper.PageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName : OaFlowServiceImpl  //类名
 * @Description : 流程管理服务接口实现类  //描述
 * @Author : 易嵘  //作者
 * @Date: 2020-08-27 08:46  //时间
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class OaFlowServiceImpl implements OaFlowService {

    /**
     * 流程dao
     */
    @Resource
    OaFlowMapper flowMapper;

    /**
     * id生成工具
     */
    @Resource
    IdToobtainUtils idToobtainUtils;

    /**
     * 流程人员关联dao
     */
    @Resource
    OaFlowPersonnelMapper flowPersonnelMapper;


    /**
     * 查询所有
     * @param flow 流程模型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 当前页数
     * @param limit 显示行数
     * @return 结果集
     */
    @Override
    public List<OaFlow> findAll(OaFlow flow, String startTime, String endTime, Integer page, Integer limit) {
        PageHelper.startPage(page,limit);
        return flowMapper.findAll(flow,startTime,endTime);
    }

    /**
     * 总行数
     * @param flow 流程模型 用于条件查询
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 总行数
     */
    @Override
    public Long rowCount(OaFlow flow, String startTime, String endTime) {
        return flowMapper.rowCount(flow,startTime,endTime);
    }

    /**
     * id查询
     * @param id 流程id
     * @return 流程模型
     */
    @Override
    public OaFlow findById(Long id) {
        return flowMapper.selectByPrimaryKey(id);
    }

    /**
     * 关键字查询
     * @param key 关键字
     * @return 结果集
     */
    @Override
    public List<OaFlow> findKeyword(String key) {
        return null;
    }

    /**
     * 修改
     * @param flow 流程模型
     * @param ids 人员id合集
     * @param personnelName 修改人
     * @return 回调函数
     */
    @Override
    public int update(OaFlow flow, String ids, String personnelName) {
        flowPersonnelMapper.deleteByFlowId(flow.getPkFlowId());
        String[] id=ids.split(",");
        if(id.length != 1 || !"".equals(id[0])){
            flowPersonnelMapper.insertAll(addOaFlowPersonnel(id,flow.getPkFlowId(),personnelName));
        }
        flow.setUpdatedBy(personnelName);
        flow.setUpdatedTime(new Date());
        return flowMapper.updateByPrimaryKeySelective(flow);
    }

    /**
     * 创建流程人员关联
     * @param ids 人员id
     * @param pkFlowId 流程id
     * @param personnelName 创建人
     * @return 流程人员关联集
     */
    private List<OaFlowPersonnel> addOaFlowPersonnel(String[] ids,Long pkFlowId,String personnelName){
        List<OaFlowPersonnel> flowPersonnels= new ArrayList<>();
        for (String id : ids) {
            OaFlowPersonnel flowPersonnel=new OaFlowPersonnel();
            flowPersonnel.setPkFlowPersonnelId(idToobtainUtils.getNumberId());
            flowPersonnel.setCreatedBy(personnelName);
            flowPersonnel.setFlowId(pkFlowId);
            flowPersonnel.setPersonnelId(Long.valueOf(id));
            flowPersonnels.add(flowPersonnel);
        }
        return flowPersonnels;
    }

    /**
     *  新增
     * @param flow 流程模型
     * @param ids 人员id合集
     * @param personnelName 创建人
     * @return 回调函数
     */
    @Override
    public int add(OaFlow flow, String ids, String personnelName) {
        flow.setPkFlowId(idToobtainUtils.getNumberId());
        flow.setCreatedBy(personnelName);
        flow.setIsRevision("1");
        String[] id=ids.split(",");
        if(id.length != 1 || !"".equals(id[0])){
            flowPersonnelMapper.insertAll(addOaFlowPersonnel(id,flow.getPkFlowId(),personnelName));
        }
        return flowMapper.insertSelective(flow);
    }

    /**
     * 批量查询
     * @param list id集
     * @return 结果集
     */
    @Override
    public List<OaFlow> selectAll(List<Long> list) {
        return flowMapper.selectAll(list);
    }

    /**
     * 批量删除
     * @param list id集
     * @return 回调函数
     */
    @Override
    public int deleteAll(List<Long> list) {
        flowPersonnelMapper.deleteFlowAll(list);
        return flowMapper.deleteAll(list);
    }

    /**
     * id删除
     * @param id 流程id
     * @return 回调函数
     */
    @Override
    public int deleteById(Long id) {
        flowPersonnelMapper.deleteByFlowId(id);
        return flowMapper.deleteByPrimaryKey(id);
    }
}
